home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / etc / init.d / netmount < prev    next >
Text File  |  2006-04-25  |  3KB  |  107 lines

  1. #!/sbin/runscript
  2. # Copyright 1999-2005 Gentoo Foundation
  3. # Distributed under the terms of the GNU General Public License v2
  4.  
  5. depend() {
  6.     local myneed="net"
  7.     local myuse=""
  8.  
  9.     # Only have Portmap as a dependency if there is a nfs mount in fstab 
  10.     # that should be mounted at boot time.  Also filter out comments.
  11.     local nfsmounts=$(awk '!/^#/ && ($3=="nfs" || $3=="nfs4") && $4 !~ /noauto/ { print $0 }' /etc/fstab)
  12.  
  13.     if [[ -n ${nfsmounts} ]] ; then
  14.         myneed="${myneed} portmap"
  15.         myuse="${myuse} nfs nfsmount"
  16.     else
  17.         myuse="${myuse} portmap"
  18.     fi
  19.  
  20.     need ${myneed}
  21.     use ${myuse}
  22. }
  23.  
  24. remove_net_fs() {
  25.     local fs
  26.     rcfilesystems=" ${rcfilesystems} "
  27.     for fs in "$@" ; do
  28.         rcfilesystems=${rcfilesystems// ${fs} / }
  29.     done
  30.     rcfilesystems=${rcfilesystems# } # remove front and
  31.     rcfilesystems=${rcfilesystems% } #   back spaces
  32. }
  33.  
  34. start() {
  35.     local rcfilesystems=${NET_FS_LIST}
  36.  
  37.     # Only try to mount NFS filesystems if portmap was started.
  38.     # This is to fix "hang" problems for new users who do not
  39.     # add portmap to the default runlevel.
  40.     if ! service_started portmap ; then
  41.         remove_net_fs nfs nfs4
  42.     fi
  43.     rcfilesystems=${rcfilesystems// /,}   # convert to comma-separated
  44.  
  45.     ebegin "Mounting network filesystems"
  46.     mount -at ${rcfilesystems} >/dev/null
  47.  
  48.     if [[ $? != 0 ]] ; then
  49.         ewend 1 "Could not mount all network filesystems!"
  50.     else
  51.         eend 0
  52.     fi
  53.  
  54.     return 0
  55. }
  56.  
  57. stop() {
  58.     local rcfilesystems=${NET_FS_LIST}
  59.  
  60.     # We let the afs init script handle unmounting afs stuff
  61.     # because it requires special handling of the afs daemon
  62.     # and similar ugly cruft
  63.     if service_started afs-client ; then
  64.         remove_net_fs afs
  65.     fi
  66.  
  67.     rcfilesystems=${rcfilesystems// /,}   # convert to comma-separated
  68.  
  69.     local ret
  70.     ebegin "Unmounting network filesystems"
  71.     [[ -z $(umount -art ${rcfilesystems} 2>&1) ]]
  72.     ret=$?
  73.     eend ${ret} "Failed to simply unmount filesystems"
  74.     [[ ${ret} == 0 ]] && return 0
  75.  
  76.     # `umount -a` will fail if the filesystems are in use.
  77.     # Here we use fuser to kill off processes that are using 
  78.     # the filesystems so that we can unmount properly.
  79.     # We will gradually use harsher kill signals so that the 
  80.     # processes know we aren't screwing around here ;).
  81.     declare -a siglist=( "TERM" "KILL" "KILL" )
  82.     local retry=0
  83.     local remaining="go"
  84.  
  85.     while [[ -n ${remaining} && ${retry} -lt 3 ]] ; do
  86.         # Populate $remaining with a newline-delimited list of network 
  87.         # filesystems.  Mount points have spaces swapped for '\040' (see 
  88.         # fstab(5)) so we have to translate them back to spaces.
  89.         remaining="$(awk '$3 ~ /'${NET_FS_LIST// /|}'/ { if ($2 != "/") print $2 }' /proc/mounts | sort -r)"
  90.         # Since we have to worry about the spaces being quoted properly, 
  91.         # we'll use `set --` and then "$@" to get the correct result.
  92.         IFS=$'\n'
  93.         set -- ${remaining//\\040/ }
  94.         unset IFS
  95.         [[ -z ${remaining} ]] && break
  96.  
  97.         # try to unmount again
  98.         ebegin $'\t'"Unmounting network filesystems (retry #$((retry+1)))"
  99.         /bin/fuser -k -${siglist[$((retry++))]} -m "$@" &>/dev/null
  100.         sleep 5
  101.         umount "$@" &>/dev/null
  102.         eend $? $'\t'"Failed to unmount filesystems"
  103.     done
  104. }
  105.  
  106. # vim:ts=4
  107.